package board.controller;

import java.sql.SQLException;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import board.domain.Board;
import board.model.service.BoardService;

@Controller
public class BoardController {
	
	@Autowired
	private BoardService boardService;
	
	
	public void setBoardService(BoardService boardService) {
		this.boardService = boardService;
	}
	
	//글 입력 폼 리턴 처리 handler메소드
	@RequestMapping("/write_form.do")
	public String writeForm(){
		return "write_form.jsp";
	}
	//새글 등록 처리 handler메소드
	@RequestMapping("/writeContent.do")
	public ModelAndView writeContent(Board board){
		ModelAndView mv = null;
			
		//2. Business Logic - Model(Business Service)로 요청
		try {
			boardService.writeContent(board);
			mv = new ModelAndView("redirect:getContent.do?no="+board.getNo());
		} catch (SQLException e) {
			e.printStackTrace();
			mv = new ModelAndView("error.jsp", "error_message", "글등록 중 오류 발생 : "+e.getMessage());
		}
		return mv;
	}
	/**
	 * page="" 으로 넘어온 경우 "1"을 설정한다.
	 * 호출 Business Logic - getBoardListByPage() : Map
	 * ModelMap에 bindng할 값 - 정상 흐름 - Service에서 리턴 받은 Map, 예외 흐름 - 예외 메세지
	 * 리턴할 View Name : 정상 흐름 - list.jsp, 예외 흐름 - error.jsp
	 * 
	 * @param page : 조회할 페이지 번호. 없으면 1 페이지로 설정
	 * @param model : View단으로 전달할 Model을 binding할 ModelMap
	 * @return String : View Name
	 * @throws Exception
	 */
	@RequestMapping("/list.do")
	public String list(@RequestParam(required=false, defaultValue="1")String page, ModelMap model) throws Exception{
		
		String url = null;
		
		return url;
	}
	/*
	 * 글조회
	 */
	@RequestMapping("/getContent.do")
	public String getContent(int no, ModelMap map){
		String url = null;
		try{
			//2. Business Logic 요청 - Model
			Board board = boardService.getContentByNO(no);
			map.addAttribute("board", board);
			url = "show_content.jsp"; 
		}catch(Exception e){
			e.printStackTrace();
			map.addAttribute("error_message", "글 조회도중 오류 발생 : "+e.getMessage());
			url = "error.jsp";
		}	
		return url;
	}
	/**
	 * 수정폼 조회 처리
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/modifyForm.do")
	public ModelAndView modifyForm(int no){
		ModelAndView mv = null;
		try{
			//2. B.L 처리
			Board board = boardService.getContentByNoForForm(no);
			mv = new ModelAndView("modify_form.jsp","board", board);
		}catch(Exception e){
			e.printStackTrace();
			mv = new ModelAndView("error.jsp","error_message", "수정할 글 조회도중 오류발생 : "+e.getMessage());
		}
		return mv;
	}
	/**
	 * 글 수정 처리 
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/modifyContent.do")
	public ModelAndView modifyContent(Board board) {
		ModelAndView mv = null;
		try {			
			//2. B.L 요청
			boardService.modifyContent(board);
			mv = new ModelAndView("redirect:getContent.do?no="+board.getNo());
		} catch (Exception e) {
			e.printStackTrace();
			mv = new ModelAndView("/error.jsp","error_message", "수정처리중 오류 발생 : "+e.getMessage());
		}
		return mv;
	}
	@RequestMapping("/deleteContent.do")
	public ModelAndView deleteContent(int no){
		ModelAndView mv = null;
		try {
			//2. BL
			boardService.deleteContentByNO(no);
			mv = new ModelAndView("/list.do");
			//mv = list(request, response);
		}catch (Exception e) {
			e.printStackTrace();
			mv = new ModelAndView("error.jsp","error_message", "삭제도중 오류 발생 : "+e.getMessage());
		}
		return mv;
	}
	/**
	 * 답변 폼 조회 처리
	 * 
	 * @return ModelAndView
	 * @throws Exception
	 */
	@RequestMapping("/replyForm.do")
	public ModelAndView replyForm(int no){
		ModelAndView mv = null;
		try {
			//1. 요청 파라미터 조회 - no
			Board board = boardService.getContentByNoForForm(no);
			mv = new ModelAndView("reply_form.jsp", "board", board);
		}catch (SQLException e) {
			e.printStackTrace();
			mv = new ModelAndView("error.jsp.jsp", "error_message", "답변할 원본글 조회도중 오류 발생 : "+e.getMessage());
		}
		return mv;
	}
	/**
	 * 답변 처리
	 * 1. 글번호 처리 : page="" 로 넘어온 경우 page="1"을 대입
	 * 2. Business Service 
	 * 1. page="" 로 넘어온 경우 page="1" 대입
	 * 2. Business Logic 호출 - replyContent()
	 * 3. 응답 : 정상 흐름 - 리다이렉트 방식으로 getContent.do 호출 (등록된 글의 번호를 QueryString으로 전달)
	 * 			   예외 흐름 - error.jsp
	 * 4. View로 전달할 값 : 정상 흐름 - 없다. 예외 흐름 - 오류 메세지
	 * @param board - 등록할 게시물 데이터
	 * @param page - 원본 글이 포함되있던 페이지 번호
	 * @return ModelAndView
	 * @throws Exception
	 */
	@RequestMapping("/replyContent.do")
	public ModelAndView replyContent(Board board,  @RequestParam(required=false, defaultValue="1") String page) throws Exception{
		ModelAndView mv = null;
		
		
		return mv;
	}
}
